/**
 * 将列表数据转换为树形结构数据
 * 参数data: 列表数据
 * 参数id: 树节点的标识名称
 * 参数parentId: 树节点的父节点名称
 * 参数children: 树节点的子节点名称
 */
function dataToTree(data, id, parentId, children){
    id = id ? id : 'id';
    parentId = parentId ? parentId : 'parentId';
    children = children ? children : 'children';
    //存放树形结构数据的数组
    var result = [];
    //遍历列表数据
    for(var i = 0; i < data.length; i++){
        //从列表数据中获取每一条数据
        var node = data[i];
        //判断当前数据是否存在父节点
        if(node[parentId]){
            //如果父节点存在，再次遍历列表数据，从源数据中查询当前节点的父节点
            for(var j = 0; j < data.length; j++){
                var treeNode = data[j];
                if(node[parentId] == treeNode[id]){
                    //其中treeNode为node数据的父节点数据
                    if(!treeNode[children]){
                        //父节点数据中的children属性如果不存在，初始化父节点数据中的children属性为一个空数组
                        treeNode[children] = [];
                    }
                    //然后将当前节点数据添加到其父节点数据中的children属性中
                    treeNode[children].push(node);
                }
            }
        }else{
            //如果父节点不存在，表示当前数据为根节点数据，直接将数据添加到结果数组中
            result.push(node);
        }
    }
    return result;
}

/**
 * 将树形数据转换为列表数据
 * 通过方法递归实现功能
 * 参数tree: 树形数据
 * 参数result: 返回值
 */
function treeToData(tree, result){
    if(!result){
        result = [];
    }
    for(var i = 0; i < tree.length; i++){
        var node = tree[i];
        //将树形数据中的当前层节点放入结果数组中
        result.push(node);
        //判断当前层节点是否有子节点
        if(node.children && node.children.length >= 1){
            //递归调用
            treeToData(node.children, result);
        }
    }
    return result;
}